package com.invoker;

import com.command.Command;
import com.command.Command_failure;
import com.command.Command_victory;
import com.receiver.Receiver;
import com.receiver.Solider;
import com.receiver.Tank;

/*
 *  【命令模式解释】
 *  类型：行为模式
 *	令模式把一个请求或者操作封装到一个对象中。
 *	命令模式允许系统使用不同的请求把客户端参数化，
 *	对请求排队或者记录请求日志，可以提供命令的撤销和撤销功能。
 *
 *	
 *	举例：在即时战略游戏中，
 *	如果基地被摧毁，
 *	那么基地就会发送一个失败的命令，所有的士兵或者车辆都会自动毁灭；
 *	
 *	如果成功破坏了对方的基地，
 *	那么基地会发送一个胜利的命令，所有的士兵或者车辆都会收到一个庆祝的命令。
 *	
 *	在该例子中，失败和胜利是两个命令；
 *	士兵和车辆（如坦克）都是命令的执行者；
 *	基地是调用者
 *  
 *  【在Java源码中的应用】
 *  在Java.io包中的File类，拥有两个列举该文件下所有子文件名的方法：list和listFiles。
 *  这两个方法中，均可以接受一个FilenameFilter参数，该参数中的accept方法，可以定义过滤的条件。
 *  在这两个方法中，FilenameFilter参数就相当于一个命令。
 *	
 */

public class Run_main {
	public static void main(String[] args){
		Receiver solider = new Solider();
		Receiver tank	 = new Tank();
		
		Command victory = new Command_victory();
		victory.add_receiver(solider);
		victory.add_receiver(tank);
		
		Command failure = new Command_failure();
		failure.add_receiver(solider);
		failure.add_receiver(tank);
		
		Invoker fundation = new Invoker(victory, failure);
		System.out.println("the army has destroy the enemy's fundation.");
		fundation.victory();
		System.out.println();
		System.out.println("our fundaion has been destroyed.");
		fundation.failure();
	}
}